/**
 * 函数和变量提升：
 * 生成执行环境时，会有两个阶段：
 * 第一个阶段是创建的阶段，JS 解释器会找出需要提升的变量和函数，并且给他们提前在内存中开辟好空间。
 * 函数的话会将整个函数存入内存中，变量只声明并且赋值为 undefined。
 * 第二个阶段，也就是代码执行阶段，我们可以直接提前使用。
 */
b()  // call b
console.log(a); // undefined

var a = 'Hello world'
function b() {
    console.log('call b');
}

// 在提升的过程中，相同的函数会覆盖上一个函数，并且函数优先于变量提升
c() // second c
console.log(c); 
/**
 * ƒ c() {
    console.log('second c');
} 
*/ 

function c() {
    console.log('first c');
}

function c() {
    console.log('second c');
}

var c = 'ccc'